package tpgrandt.varios;

import java.util.Arrays;
import tpgrandt.excepciones.DineroGastadoException;
import tpgrandt.excepciones.JugadorExistenteException;
import tpgrandt.excepciones.JugadoresPorClubException;
import tpgrandt.excepciones.JugadoresPorPuestoException;
import tpgrandt.excepciones.PuestoInvalidoException;
import tpgrandt.excepciones.TransferenciasException;

/**
 * @version 1.0
 * @created 19-Jan-2010 17:12:24
 */
public class PlantelFecha {

        private static final int CANTIDAD = 15;
        public static final int cotizacion_max = 50000;
        public static final int transferencias_max = 3;
        public static final int jugadores_por_club = 3;

	private int fecha;
	private int puntos;
	private int posicion;
	private Integrante jugador_estrella;
	private Integrante[] plantelTemp;
	private Integrante[] plantel;
	private int cotizacionTemp = 0;
        private int cotizacion = 0;
	private int transferenciasTemp = 0;
        private int transferencias = 0;
        private boolean confirmado;

	public PlantelFecha(int fecha){
            this.fecha = fecha;
            puntos = 0;
            posicion = 0;
            jugador_estrella = null;
	    plantel = new Integrante[CANTIDAD+1];
	    for (int i = 1; i <= CANTIDAD; i++)
		plantel[i] = new Integrante(fecha, i);
            plantelTemp = clonar(plantel);
            cotizacionTemp = 0;
            transferenciasTemp = 0;
            confirmado = false;
	}

    public Integrante[] getIntegrantes() {
        return plantel;
    }
/*
    public void setPlantel(Integrante[] plantel) {
        this.plantelTmp = plantel;
    }
*/
    public int getCotizacion() {
        return cotizacionTemp;
    }

    public void setCotizacion(int cotizacion) {
        this.cotizacionTemp = cotizacion;
        this.cotizacion = cotizacion;
    }

    public int getFecha() {
        return fecha;
    }

    public void setFecha(int fecha) {
        this.fecha = fecha;
    }

    public Integrante getJugador_estrella() {
        return jugador_estrella;
    }

    public void setJugador_estrella(int jugador_estrella) {
        this.jugador_estrella = plantel[jugador_estrella];
    }

    public int getPosicion() {
        return posicion;
    }

    public void setPosicion(int posicion) {
        this.posicion = posicion;
    }

    public int getPuntos() {
        return puntos;
    }

    public void setPuntos(int puntos) {
        this.puntos = puntos;
    }

    public boolean equipoCompleto() {
            boolean out = true;
            int i = 1;

            while (out && i <= CANTIDAD) {
                out = plantelTemp[i].getJugador1ra() != null;
                i++;
            }

            return out;
        }

	public void confirmar() {
            plantel = clonar(plantelTemp);
            cotizacion = cotizacionTemp;
            transferencias = transferenciasTemp;
            confirmado = true;
	}

	public void cancelar() {
	    plantelTemp = clonar(plantel);
            cotizacionTemp = cotizacion;
            transferenciasTemp = transferencias;
	}

        public boolean confirmado() {
            return confirmado;
        }

    public void setPlantel(Integrante lista[]) {
        this.plantel = lista;
        this.plantelTemp = clonar(plantel);
    }

    public int getTransferencias() {
        return transferenciasTemp;
    }

    public void setTransferencias(int transferencias) {
        this.transferenciasTemp = transferencias;
        this.transferencias = transferencias;
    }

        public int agregar(Jugador jugador)
                  throws JugadoresPorPuestoException, DineroGastadoException, JugadoresPorClubException, JugadorExistenteException {
        int pos=0;

        if((cotizacion_max - cotizacionTemp) >= jugador.getCotizacion()) {

        int cont = 0;


        for(int i = 1; i <= CANTIDAD && cont <= jugadores_por_club; i++) {

            if(plantelTemp[i].getJugador1ra() != null){
                if(jugador.getClub().getNombre().equals(plantelTemp[i].getJugador1ra().getClub().getNombre()))
                    cont++;
                if(jugador.getId_jugador() == plantelTemp[i].getJugador1ra().getId_jugador())
                    throw new JugadorExistenteException();
            }
        }

        if(cont >= jugadores_por_club)
            throw new JugadoresPorClubException();

	    if(jugador.getPuesto() == Jugador.ARQUERO){
		if(plantelTemp[1].getJugador1ra() == null) {
		    pos = 1;
		    plantelTemp[pos].setJugador1ra(jugador);
		    plantelTemp[pos].setPosicion(pos);
		}
		else if(plantelTemp[12].getJugador1ra() == null) {
			pos = 12;
			plantelTemp[pos].setJugador1ra(jugador);
			plantelTemp[pos].setPosicion(pos);
                }
		    else
			throw new JugadoresPorPuestoException();
            }

	    if( jugador.getPuesto() == Jugador.DEFENSOR) {
		if(plantelTemp[2].getJugador1ra() == null) {
		    pos = 2;
		    plantelTemp[pos].setJugador1ra(jugador);
		    plantelTemp[pos].setPosicion(pos);
                }
		else if(plantelTemp[3].getJugador1ra() == null) {
			pos = 3;
			plantelTemp[pos].setJugador1ra(jugador);
			plantelTemp[pos].setPosicion(pos);
                }
		    else if(plantelTemp[4].getJugador1ra() == null) {
			    pos = 4;
			    plantelTemp[pos].setJugador1ra(jugador);
			    plantelTemp[pos].setPosicion(pos);
                    }
			else if(plantelTemp[5].getJugador1ra() == null) {
				pos = 5;
				plantelTemp[pos].setJugador1ra(jugador);
				plantelTemp[pos].setPosicion(pos);
                        }
			    else if(plantelTemp[13].getJugador1ra() == null) {
				    pos = 13;
				    plantelTemp[pos].setJugador1ra(jugador);
				    plantelTemp[pos].setPosicion(pos);
                            }
				else
                                    throw new JugadoresPorPuestoException();

            }
	    if( jugador.getPuesto() == Jugador.VOLANTE) {
		if(plantelTemp[6].getJugador1ra() == null){
		    pos = 6;
		    plantelTemp[pos].setJugador1ra(jugador);
		    plantelTemp[pos].setPosicion(pos); }
		else
		    if(plantelTemp[7].getJugador1ra() == null){
			pos = 7;
			plantelTemp[pos].setJugador1ra(jugador);
			plantelTemp[pos].setPosicion(pos); }
		    else
			if(plantelTemp[8].getJugador1ra() == null){
			    pos = 8;
			    plantelTemp[pos].setJugador1ra(jugador);
			    plantelTemp[pos].setPosicion(pos); }
			else
			    if(plantelTemp[14].getJugador1ra() == null){
				pos = 14;
				plantelTemp[pos].setJugador1ra(jugador);
				plantelTemp[pos].setPosicion(pos); }
			    else throw new JugadoresPorPuestoException();
	    }

	    if( jugador.getPuesto() == Jugador.DELANTERO) {
		if(plantelTemp[9].getJugador1ra() == null){
		    pos = 9;
		    plantelTemp[pos].setJugador1ra(jugador);
		    plantelTemp[pos].setPosicion(pos); }
		else
		    if(plantelTemp[10].getJugador1ra() == null){
			pos = 10;
			plantelTemp[pos].setJugador1ra(jugador);
			plantelTemp[pos].setPosicion(pos); }
		    else
		    if(plantelTemp[11].getJugador1ra() == null){
			pos = 11;
			plantelTemp[pos].setJugador1ra(jugador);
			plantelTemp[pos].setPosicion(pos); }
		    else
			if(plantelTemp[15].getJugador1ra() == null){
			    pos = 15;
			    plantelTemp[pos].setJugador1ra(jugador);
			    plantelTemp[pos].setPosicion(pos); }
			else throw new JugadoresPorPuestoException();
	    }
	}

        else
	    throw new DineroGastadoException();


        cotizacionTemp += jugador.getCotizacion();
        return pos;

    }
	/**
	 *
	 * @param titular
	 */
	public void cambiar(Jugador titular){

            Integer pos = 0;
            int posi = 0;
            int i=0;
            Jugador suplente = null;

            pos = titular.getPuesto();

            if(pos == Jugador.ARQUERO){
		suplente = plantelTemp[12].getJugador1ra();
		plantelTemp[1].setJugador1ra(suplente);
                plantelTemp[12].setJugador1ra(titular);
            }

           if(pos == Jugador.DEFENSOR){
               suplente = plantelTemp[13].getJugador1ra();

		for(i=2;i<=5;i++)
		    if(plantelTemp[i].getJugador1ra() != null && plantelTemp[i].getJugador1ra().getId_jugador() == titular.getId_jugador())
			posi = i;

		plantelTemp[posi].setJugador1ra(suplente);
		plantelTemp[13].setJugador1ra(titular);
            }

            if(pos == Jugador.VOLANTE){
		suplente = plantelTemp[14].getJugador1ra();

		for(i=6;i<=8;i++)
		    if(plantelTemp[i].getJugador1ra() != null && plantelTemp[i].getJugador1ra().getId_jugador() == titular.getId_jugador())
			posi = i;

		plantelTemp[posi].setJugador1ra(suplente);
                plantelTemp[14].setJugador1ra(titular);
	    }


	    if(pos == Jugador.DELANTERO){
		suplente = plantelTemp[15].getJugador1ra();

		for(i=9;i<=11;i++)
		    if(plantelTemp[i].getJugador1ra() != null && plantelTemp[i].getJugador1ra().getId_jugador() == titular.getId_jugador())
			posi = i;

		plantelTemp[posi].setJugador1ra(suplente);
		plantelTemp[15].setJugador1ra(titular);
	    }
	}

	/**
	 *
	 * @param pos
	 */
	public Jugador getJugador(int pos){
	    return plantel[pos].getJugador1ra();
	}

	/**
	 *
	 * @param jugador
	 */
	public void quitar(int pos){
	   cotizacionTemp -= plantelTemp[pos].getJugador1ra().getCotizacion();
           plantelTemp[pos].setJugador1ra(null);
	}


	/**
	 *
	 * @param jugador2
	 * @param jugador1
	 */
	public void transferir(Jugador jugadorEntrante, Jugador jugadorSaliente)
            throws DineroGastadoException, JugadorExistenteException, TransferenciasException, JugadoresPorPuestoException, JugadoresPorClubException, PuestoInvalidoException{

            int i,j=0;
            int pos=0;



        if(this.getTransferencias() < PlantelFecha.transferencias_max) {
            if((cotizacionTemp - jugadorSaliente.getCotizacion() + jugadorEntrante.getCotizacion()) > cotizacion_max)
                throw new DineroGastadoException();

            else {

                     for(j=1;j<=15;j++)
                            if(plantelTemp[j].getJugador1ra().getId_jugador() == jugadorEntrante.getId_jugador())
                                throw new JugadorExistenteException();



                    for(i=1;i<=15;i++)
                        if(plantelTemp[i].getJugador1ra().getId_jugador() == jugadorSaliente.getId_jugador())
                            pos = i;

            int c=0;

               for(j=1;j<=15;j++){
                 if(jugadorEntrante.getClub().getId_equipo() == plantelTemp[j].getJugador1ra().getClub().getId_equipo())
                            c++;
               }

            if(c>=3) throw new JugadoresPorClubException();

                 if(jugadorSaliente.getPuesto() == jugadorEntrante.getPuesto()) {
                    plantelTemp[pos].setJugador1ra(null);
                    plantelTemp[pos].setJugador1ra(jugadorEntrante);
                 }
                 else throw new PuestoInvalidoException();

            cotizacionTemp += jugadorEntrante.getCotizacion() - jugadorSaliente.getCotizacion();
            }

            transferenciasTemp++;
        }
        else
            throw new TransferenciasException();
        }

        public static Integrante[] clonar (Integrante[] integ) {
            Integrante[] integ2 = new Integrante[integ.length];
            for (int i = 1; i < integ.length; i++) {
                integ2[i] = new Integrante(integ[i].getFecha(), integ[i].getPosicion());
                integ2[i].setJugador1ra(integ[i].getJugador1ra());
            }
            return integ2;
        }

}
